package com.my.test.service.util;

import org.apache.log4j.Logger;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
import org.springframework.util.StringUtils;

public class CommonLogger {
    private static Logger log = Logger.getLogger("api");
    private static Logger infoLog = Logger.getLogger("info");
    private static Logger warnLog = Logger.getLogger("warn");
    private static Logger errorLog = Logger.getLogger("error");

    public static void info(Object msg) {
        if (infoLog.isInfoEnabled()) {
            //日志最后添加reuqestid，格式为r=1
            msg = assembleRequestId(msg);
            infoLog.info(msg);
        }
    }

    /**
     * 输出一条用于 INFO 日志。内容根据格式化模板和格式化参数输出。
     * <p/>
     * <p/>
     * 如果 INFO 级别被禁用，此方法调用会避免无用的日志内容创建过程。
     *
     * @param format 格式化模板。
     * @param arg    格式化参数。
     */
    public static void info(String format, Object arg) {
        if (infoLog.isInfoEnabled()) {
            FormattingTuple tuple = MessageFormatter.format(format, arg);
            infoLog.info(assembleRequestId(tuple.getMessage()), tuple.getThrowable());
        }
    }

    /**
     * 输出一条 INFO 日志。内容根据格式化模板和格式化参数输出。
     * <p/>
     * <p/>
     * 如果 INFO 级别被禁用，此方法调用会避免无用的日志内容创建过程。
     *
     * @param format 格式化模板。
     * @param argA   第一个格式化参数。
     * @param argB   第二个格式化参数。
     */
    public static void info(String format, Object argA, Object argB) {
        if (infoLog.isInfoEnabled()) {
            FormattingTuple tuple = MessageFormatter.format(format, argA, argB);
            infoLog.info(assembleRequestId(tuple.getMessage()), tuple.getThrowable());
        }
    }

    /**
     * 输出一条 INFO 日志。内容根据格式化模板和格式化参数输出。
     * <p/>
     * <p/>
     * 如果 INFO 级别被禁用，此方法调用会避免无用的日志内容创建过程。
     *
     * @param format    格式化模板。
     * @param arguments 三个以上一系列的格式化参数。
     */
    public static void info(String format, Object... arguments) {
        if (infoLog.isInfoEnabled()) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, arguments);
            infoLog.info(assembleRequestId(tuple.getMessage()), tuple.getThrowable());
        }
    }

    public static void warn(Object msg) {
        //日志最后添加reuqestid，格式为r=1
        msg = assembleRequestId(msg);
        warnLog.warn(msg);
    }

    public static void warn(Object msg, Throwable e) {
        //日志最后添加reuqestid，格式为r=1
        msg = assembleRequestId(msg);
        warnLog.warn(msg, e);
    }

    public static void error(Object msg) {
        //日志最后添加reuqestid，格式为r=1
        msg = assembleRequestId(msg);
        errorLog.error(msg);
    }

    public static void error(Object msg, Throwable e) {
        //日志最后添加reuqestid，格式为r=1
        msg = assembleRequestId(msg);
        errorLog.error(msg, e);
    }

    public static Object assembleRequestId(Object msg) {
        if (msg != null) {
            //日志最后添加reuqestid，格式为r=1
            msg = assembleRequestId(msg.toString(), " ");
        } else {
            msg = assembleRequestId("null", " ");
        }
        return msg;
    }

    public static String assembleRequestId(String msg, String spit) {
        String requestid = getRequestId();
        StringBuffer buf = new StringBuffer(msg);
        //日志最后添加reuqestid，格式为r=1,requestid为空时不添加
        if (!StringUtils.isEmpty(requestid)) {
            buf.append(spit).append(requestid);
            msg = buf.toString();
        }
        return msg;
    }

    public static String getRequestId() {
        RequestTraceContext context = RequestTraceContext.get();
        String requestid = "";
        if (context != null) {
            StringBuffer buf = new StringBuffer();
            buf.append("r=").append(context.getId());
            requestid = buf.toString();
        }
        return requestid;
    }
}